|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(* Программа игры в русские шашки на языке Глагол. *) (******************************************************************************) (**) ОТДЕЛ Шашки64+; (******************************************************************************) (* НАЗНАЧЕНИЕ: создание экранных надписей и кнопочек *) (* ПРИМЕЧАНИЯ: для управления можно использовать только мышку, *) (* правила игры см. в отделе \Глагол\Приложения\Игры\Шашки\Игра.отд *) (* и в отделе \Глагол\Приложения\Игры\Шашки\Доска.отд *) (******************************************************************************) ИСПОЛЬЗУЕТ Игра ИЗ ".\Шашки\", (* алгоритм игры *) Доска ИЗ ".\Шашки\", (* рисунок доски *) Ввод ИЗ "...\Отделы\Обмен\", ОС ИЗ "...\Отделы\Обмен\", Окно ИЗ "...\Отделы\Обмен\", Поле ИЗ "...\Отделы\Поле\", Надел ИЗ "...\Отделы\Поле\", Подложка ИЗ "...\Отделы\Поле\", Черта ИЗ "...\Отделы\Поле\", Записка ИЗ "...\Отделы\Поле\", Кнопка ИЗ "...\Отделы\Поле\"; ПОСТ (* действия *) дЗаново =1; дВыход =2; дПредУровень=3; дСледУровень=4; ПЕР времяНижних,времяВерхних,времяОбновления:ЦЕЛ; (* для секундомера *) зЖдите,зВремяН,зВремяВ,зУровень:Записка.Доступ; (* надписи *) (******************************************************************************) ЗАДАЧА ОбновитьСекундомер(номерЧасов:ЦЕЛ); (* обновить секундомер *) ПЕР прошлоВремени:ЦЕЛ; сек:ЦЕЛ; ЗАДАЧА ВыводХода(ход-:Игра.Ход); (* вывод на табло хода машины *) ПЕР x0,y0,x1,y1:ЦЕЛ; ЗАДАЧА NвXY(n,x+,y+:ЦЕЛ); УКАЗ ЕСЛИ НЕ Доска.нижниеБелые ТО n:=100-n КОН; x:=Игра.NвX[n]; y:=Игра.NвY[n] КОН NвXY; УКАЗ ЕСЛИ ход.откудаN = ход.кудаN ТО Записка.Изменить(зЖдите,"") (* пустой ход *) ИНАЧЕ NвXY(ход.откудаN,x0,y0); NвXY(ход.кудаN,x1,y1); ЕСЛИ ход.битых > 0 ТО Записка.ИзЧЦел(зЖдите, "%c%d:%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1) ИНАЧЕ Записка.ИзЧЦел(зЖдите, "%c%d-%c%d", x0+ВЦЕЛ("a")-1, y0, x1+ВЦЕЛ("a")-1, y1) КОН; КОН КОН ВыводХода; УКАЗ прошлоВремени:=ОС.Время()-времяОбновления; времяОбновления:=ОС.Время(); ЕСЛИ Игра.конец ТО Записка.Изменить(зЖдите,"--КОНЕЦ--") ИНАЧЕ ЕСЛИ Доска.думаютНижние ТО УВЕЛИЧИТЬ(времяНижних,прошлоВремени); ВыводХода(Игра.ходМашины) ИНАЧЕ УВЕЛИЧИТЬ(времяВерхних,прошлоВремени); Записка.Изменить(зЖдите,"Подождите") КОН КОН; сек:=времяВерхних ДЕЛИТЬ 1000; Записка.ИзЧЦел(зВремяВ, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0); сек:=времяНижних ДЕЛИТЬ 1000; Записка.ИзЧЦел(зВремяН, "%.2d:%.2d", сек ДЕЛИТЬ 60, сек ОСТАТОК 60, 0,0); КОН ОбновитьСекундомер; (******************************************************************************) ЗАДАЧА ПредУровень; УКАЗ ЕСЛИ Игра.уровень > 2 ТО УМЕНЬШИТЬ(Игра.уровень); Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0) КОН КОН ПредУровень; (******************************************************************************) ЗАДАЧА СледУровень; УКАЗ ЕСЛИ Игра.уровень < 10 ТО УВЕЛИЧИТЬ(Игра.уровень); Записка.ИзЧЦел(зУровень,"%d",Игра.уровень-1,0,0,0) КОН КОН СледУровень; (******************************************************************************) ЗАДАЧА НачатьЗаново(поле:Поле.Доступ); (* начать новую игру *) УКАЗ Записка.Изменить(зЖдите,"") (* пустой ход *) Записка.Изменить(зВремяН,""); Записка.Изменить(зВремяВ,""); времяНижних:=0; времяВерхних:=0; времяОбновления:=ОС.Время(); Игра.НачатьЗаново; Доска.НачатьЗаново; Поле.Рисовать(поле) КОН НачатьЗаново; (******************************************************************************) ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка); (* получить и обработать управляющие послания *) УКАЗ ДЛЯ посылка ВИДА | Ввод.ОтКлавиш: ЕСЛИ посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *) ИЛИ (посылка.код = 1BH) (* Esc *) ТО поле.состояние:=дВыход; посылка.код:=0 КОН | Кнопка.Посылка: ВЫБРАТЬ посылка.кнопка.действие ИЗ | дЗаново: НачатьЗаново(поле) | дВыход: поле.состояние:=дВыход | дПредУровень: ПредУровень | дСледУровень: СледУровень КОН | Доска.Посылка: ОбновитьСекундомер(1) ИНАЧЕ КОН КОН Приём; (******************************************************************************) ЗАДАЧА СоздатьПоле():Поле.Доступ; (* создает рабочее поле экрана *) ПЕР поле:Поле.Доступ; (* рабочее поле экрана *) чВертикаль, чГоризонталь:Черта.Доступ; (* черты *) кнЗаново,кнВыход, кнБольше,кнМеньше:Кнопка.Доступ; (* управляющие кнопки *) зСловоУровень:Записка.Доступ; (* слово "Уровень" *) доска:Доска.Доступ; (* игровая доска *) подложка:Подложка.Доступ; (* подложка поля *) УКАЗ (* создаём поле *) поле:=Поле.Создать(0,0,10,30,ПУСТО,ОТКЛ,Приём); (* создаём наделы *) <*ЕСЛИ Доска.Оборотень ТО*> подложка:=Подложка.Создать(0,0,0,0,"Оборотень"); <*ИНАЧЕ*> подложка:=Подложка.Создать(0,0,0,0,""); <*КОН*> доска:=Доска.Создать(1,1); зВремяВ:=Записка.Создать(1,18,1,5,""); зВремяН:=Записка.Создать(8,18,1,5,""); зЖдите:= Записка.Создать(2,18,1,9,""); Игра.уровень:=5; зУровень:=Записка.Создать(5,23,1,1,"4"); зСловоУровень:=Записка.Создать(4,20,1,7,"Уровень"); (* создаём черты *) чВертикаль :=Черта.Создать(0,17,0,1); чГоризонталь:=Черта.Создать(3,17,1,0); (* создаём кнопки *) кнМеньше:=Кнопка.Создать(5,18,"[<~М]",дПредУровень,ВКЛ); кнБольше:=Кнопка.Создать(5,25,"[~Б>]",дСледУровень,ВКЛ); кнЗаново:=Кнопка.Создать(6,19,"[ ~Заново]",дЗаново,ВКЛ); кнВыход :=Кнопка.Создать(7,19,"[ ~Выход ]",дВыход,ВКЛ); (* добавляем наделы в порядке отрисовки и получения ввода *) Поле.ДобавитьНадел(поле,подложка); Поле.ДобавитьНадел(поле,зВремяВ); Поле.ДобавитьНадел(поле,зВремяН); Поле.ДобавитьНадел(поле,зЖдите); Поле.ДобавитьНадел(поле,зУровень); Поле.ДобавитьНадел(поле,зСловоУровень); Поле.ДобавитьНадел(поле,чВертикаль); Поле.ДобавитьНадел(поле,чГоризонталь); Поле.ДобавитьНадел(поле,доска); Поле.ДобавитьНадел(поле,кнМеньше); Поле.ДобавитьНадел(поле,кнБольше); Поле.ДобавитьНадел(поле,кнЗаново); Поле.ДобавитьНадел(поле,кнВыход); ВОЗВРАТ поле КОН СоздатьПоле; (******************************************************************************) ЗАДАЧА Поехали; ПЕР поле:Поле.Доступ; часы:ЦЕЛ; УКАЗ Окно.Графическое("Шашки","Lucida Console",30,ОбновитьСекундомер); (* Окно.Текстовое(ОбновитьСекундомер); *) поле:=СоздатьПоле(); Поле.ОкноНаВсёПоле(поле); Поле.Рисовать(поле); НачатьЗаново(поле); часы:=Окно.СоздатьЧасы(1,1000); (* обновляем часы через 1000 мс *) Окно.Показать; (* проверяем и обрабатываем ввод от человека *) ПОКА поле.состояние = Поле.сРабота ВЫП Поле.Проверить(поле) КОН; Окно.УдалитьЧасы(часы) КОН Поехали; (******************************************************************************) УКАЗ Поехали КОН Шашки64. ▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|